Return to start page

Core/Maths/Library Conversion.j

Code

		
1			library ALibraryCoreMathsConversion requires optional ALibraryCoreDebugMisc, ALibraryCoreStringMisc
2
3 /**
4 * Converts an integer into any numeral system
5 * The A in I2A stands for alpha-numeric.
6 * @param value The integer value which will be converted.
7 * @param chars The character pool of the numeral system.
8 * @return Returns the converted value as string.
9 */
10 function I2A takes integer value, string chars returns string
11 local string alphanumeric = ""
12 local integer index = 0
13 debug if ((value >= 0) or (value <= 0x7FFFFFFF)) then
14 loop
15 set index = (ModuloInteger(value, StringLength(chars)) + 1)
16 set value = (value / StringLength(chars))
17 set alphanumeric = (SubStringBJ(chars, index, index) + alphanumeric)
18 exitwhen (value == 0)
19 endloop
20 debug else
21 debug call Print("Invalid integer.")
22 debug endif
23 return alphanumeric
24 endfunction
25
26 /**
27 * Converts a number from any numeral system into an integer.
28 * The A in A2I stands for alpha-numeric.
29 * @param alphanumeric The alpha-numeric string which will be converted.
30 * @param chars The character pool of the numeral system.
31 * @return Returns the converted integer.
32 */
33 function A2I takes string alphanumeric, string chars returns integer
34 local integer value = 0
35 local integer index = 1
36 loop
37 set value = value + ((FindString(chars, SubString(alphanumeric, (StringLength(alphanumeric) - 1), StringLength(alphanumeric)))) * index)
38 exitwhen (StringLength(alphanumeric) == 1)
39 set alphanumeric = SubString(alphanumeric, 0, (StringLength(alphanumeric) - 1))
40 set index = index * StringLength(chars)
41 endloop
42 return value
43 endfunction
44
45 /// @author Vexorian
46 /// @source http://www.wc3c.net/showthread.php?t=101407
47 function I2Roman takes integer n returns string
48 local string r=""
49 if n > 3999 or n < 1 then
50 return I2S(n)
51 endif
52 loop
53 exitwhen n<1000
54 set r=r+"M"
55 set n=n-1000
56 endloop
57 loop
58 exitwhen n < 900
59 set r=r+"CM"
60 set n=n-900
61 endloop
62 loop
63 exitwhen n<500
64 set r=r+"D"
65 set n=n-500
66 endloop
67 loop
68 exitwhen n < 400
69 set r=r+"CD"
70 set n=n-400
71 endloop
72 loop
73 exitwhen n<100
74 set r=r+"C"
75 set n=n-100
76 endloop
77 loop
78 exitwhen n < 90
79 set r=r+"XC"
80 set n=n-90
81 endloop
82 loop
83 exitwhen n<50
84 set r=r+"L"
85 set n=n-50
86 endloop
87 loop
88 exitwhen n < 40
89 set r=r+"XL"
90 set n=n-40
91 endloop
92 loop
93 exitwhen n<10
94 set r=r+"X"
95 set n=n-10
96 endloop
97 loop
98 exitwhen n < 9
99 set r=r+"IX"
100 set n=n-9
101 endloop
102 loop
103 exitwhen n<5
104 set r=r+"V"
105 set n=n-5
106 endloop
107 loop
108 exitwhen n < 4
109 set r=r+"IV"
110 set n=n-4
111 endloop
112 loop
113 exitwhen n<1
114 set r=r+"I"
115 set n=n-1
116 endloop
117 return r
118 endfunction
119
120
121 //! textmacro ALibraryCoreMathsConversionMacro takes TYPENAME, CHARS
122 /// @state untested
123 function I2$TYPENAME$ takes integer Integer returns string
124 return I2A(Integer, "$CHARS$")
125 endfunction
126
127 /// @state untested
128 function $TYPENAME$2I takes string $TYPENAME$ returns integer
129 return A2I($TYPENAME$, "$CHARS$")
130 endfunction
131 //! endtextmacro
132
133 //! runtextmacro ALibraryCoreMathsConversionMacro("Binary", "01")
134 //! runtextmacro ALibraryCoreMathsConversionMacro("Octal", "01234567")
135 //! runtextmacro ALibraryCoreMathsConversionMacro("Hexadecimal", "0123456789ABCDEF")
136
137 endlibrary